// 根据特定条件完全覆盖函数（例如，出于缓存目的）

/**
 * @param target 类的原型
 * @param propertyName 字符串方法名
 * @param descriptor 属性描述其 descriptor.value就是方法
 * */
const cache = new Map();
function cacheResult(target,propertyName,descriptor){
    const originalMethod = descriptor.value;
    descriptor.value = function (...args){
        const cacheKey = JSON.stringify(args);
        if(cache.has(cacheKey)){
            return cache.get(cacheKey);
        }else{
            const result = originalMethod.apply(this, args);
            cache.set(cacheKey, result);
            return result;
        }
    }
}

// 加入调用calculate 方法会有很大的计算量，每次计算将结果和参数做键值对缓存，每次调用方法前先判断缓存是否含有
class Example{
    @cacheResult
    calculate(a:number,b:number){
        console.log('original calculate');
        return a+b;
    }
}

const example = new Example();
example.calculate(1,2);
example.calculate(1,2);
example.calculate(1,3);
